package netty

import com.alibaba.fastjson.JSON
import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext
import io.netty.handler.codec.ByteToMessageDecoder

/*
 * @author uv
 * @date 2018/10/13 18:09
 * 解码器（将接收的数据转换成实体类）
 */
object RpcDecoder : ByteToMessageDecoder() {
    //目标对象类型进行解码
    //private Class<?> target;

    @Throws(Exception::class)
    override fun decode(ctx: ChannelHandlerContext, byteBuf: ByteBuf, out: MutableList<Any>) {
        println("client:decode")
        if (byteBuf.readableBytes() < 4) { //不够长度丢弃
            return
        }
        byteBuf.markReaderIndex() //标记一下当前的readIndex的位置
        val dataLength = byteBuf.readInt() // 读取传送过来的消息的长度。ByteBuf 的readInt()方法会让他的readIndex增加4
        if (byteBuf.readableBytes() < dataLength) { //读到的消息体长度如果小于我们传送过来的消息长度，则resetReaderIndex. 这个配合markReaderIndex使用的。把readIndex重置到mark的地方
            byteBuf.resetReaderIndex()
            return
        }
        val data = ByteArray(dataLength)
        byteBuf.readBytes(data)
        val obj = JSON.parse(data)
        println("client:decode-obj:$obj")
        //Object obj = JSON.parseObject(data, target); //将byte数据转化为我们需要的对象
        out.add(obj)
    }
}
